#include<TCPKernel.h>
#include "packdef.h"
#include<stdio.h>
#include<sys/time.h>
#include"clogic.h"

using namespace std;


//设置网络协议映射
void TcpKernel::setNetPackMap()
{
    //清空映射
    bzero( m_NetPackMap , sizeof(m_NetPackMap) );

    //协议映射赋值
    m_logic->setNetPackMap();

}


TcpKernel::TcpKernel()
{

}

TcpKernel::~TcpKernel()
{
    if( m_logic ) delete m_logic;
}

//单例模式，获取当前对象
TcpKernel *TcpKernel::GetInstance()
{
    static TcpKernel kernel;
    return &kernel;
}

//开启核心服务
int TcpKernel::Open( int port)
{
    initRand();

    m_sql = new CMysql;
    // 数据库 使用127.0.0.1 地址  用户名root 密码123 数据库 huiyi 没有的话需要创建 不然报错
    if(  !m_sql->ConnectMysql( _DEF_DB_IP , _DEF_DB_USER, _DEF_DB_PWD, _DEF_DB_NAME )  )
    {
        printf("Conncet Mysql Failed...\n");
        return FALSE;
    }
    else
    {
        printf("MySql Connect Success...\n");
    }
    //初始网络
    m_tcp = new Block_Epoll_Net;
    bool res = m_tcp->InitNet( port , &TcpKernel::DealData );
    if( false == res )
    {
        err_str( "net init fail:" ,-1);
        return false;
    }

    //创建logic逻辑类
    m_logic = new CLogic(this);

    setNetPackMap();

    return TRUE;
}

void TcpKernel::Close()
{
    m_sql->DisConnect();

}

//随机数初始化
void TcpKernel::initRand()
{
    struct timeval time;
    gettimeofday( &time , NULL);
    srand( time.tv_sec + time.tv_usec );
}

void TcpKernel::DealData(sock_fd clientfd,char *szbuf,int nlen)
{
    PackType type = *(PackType*)szbuf;
    if( (type >= _DEF_PACK_BASE) && ( type < _DEF_PACK_BASE + _DEF_PACK_COUNT) )
    {
        PFUN pf = NetPackMap( type );
        if( pf )
        {
            (TcpKernel::GetInstance()->m_logic->*pf)( clientfd , szbuf , nlen);
            //(TcpKernel::GetInstance()->*pf)( clientfd , szbuf , nlen);
        }
    }
    return;
}

//epoll事件循环
void TcpKernel::EventLoop()
{
    printf("event loop\n");
    m_tcp->EventLoop();
}

void TcpKernel::SendData(sock_fd clientfd, char *szbuf, int nlen)
{
    m_tcp->SendData(clientfd , szbuf ,nlen );
}

//void TcpKernel::RegisterRq(int clientfd, char *szbuf, int nlen)
//{
//    cout<<"RegisterRq:clientfd:"<<clientfd<<endl;
//    //1.拆包 获取tel password name
//    STRU_REGISTER_RQ* rq = (STRU_REGISTER_RQ*)szbuf;
//    STRU_REGISTER_RS rs;
//    char sqlStr[1024]={0};
//    sprintf(sqlStr,"select tel from t_user where tel = '%s';",
//            rq->m_tel);
//    list<string> resList;
//    if(!m_sql->SelectMysql(sqlStr,1,resList))
//    {
//        cout<<"selectMysql error:"<<sqlStr<<endl;
//        return;
//    }
//    if(resList.size()>0)//已经有这个手机号了,返回用户已存在
//    {
//        rs.m_result = user_is_exist;
//    }
//    else
//    {
//        //查表 t_user 根据tel查tel
//        sprintf(sqlStr,"select name from t_user where name = '%s';",
//                rq->m_name);
//        resList.clear();
//        if(!m_sql->SelectMysql(sqlStr,1,resList))
//        {
//            cout<<"selectMysql error:"<<sqlStr<<endl;
//            return;
//        }
//        if(resList.size()>0)//已经有这个昵称了,返回昵称已存在
//        {
//            rs.m_result = name_is_exist;
//        }
//        else//没有 写入数据库 返回注册成功
//        {
//            rs.m_result = register_success;
//            sprintf(sqlStr,"insert into t_user(tel,password,name,icon,feeling) "
//                           "values('%s','%s','%s','%d','%s');",
//                    rq->m_tel,rq->m_password,rq->m_name,1,"nothing");
//            if(!m_sql->UpdataMysql(sqlStr))
//            {
//                cout<<"updataMysql error:"<<sqlStr<<endl;
//                return;
//            }
//        }
//    }
//    m_tcp->SendData(clientfd,(char*)&rs,sizeof(rs));
//}

//void TcpKernel::LoginRq(int clientfd, char *szbuf, int nlen)
//{
//    cout<<"LoginRq:clientfd:"<<clientfd<<endl;
//    //拆包 获取tel password

//    //根据tel查password和id,判断

//    //登录成功,sock保存起来,存到id->sock的映射,便于通信

//    STRU_REGISTER_RQ* rq = (STRU_REGISTER_RQ*)szbuf;
//    STRU_REGISTER_RS rs;
//    char sqlStr[1024]={0};
//    sprintf(sqlStr,"select tel from t_user where tel = '%s';",
//            rq->m_tel);
//    list<string> resList;
//    if(!m_sql->SelectMysql(sqlStr,1,resList))
//    {
//        cout<<"selectMysql error:"<<sqlStr<<endl;
//        return;
//    }
//    if(resList.size()>0)//已经有这个手机号了,返回用户已存在
//    {
//        rs.m_result = user_is_exist;
//    }
//    else
//    {
//        //查表 t_user 根据tel查tel
//        sprintf(sqlStr,"select name from t_user where name = '%s';",
//                rq->m_name);
//        resList.clear();
//        if(!m_sql->SelectMysql(sqlStr,1,resList))
//        {
//            cout<<"selectMysql error:"<<sqlStr<<endl;
//            return;
//        }
//        if(resList.size()>0)//已经有这个昵称了,返回昵称已存在
//        {
//            rs.m_result = name_is_exist;
//        }
//        else//没有 写入数据库 返回注册成功
//        {
//            rs.m_result = register_success;
//            sprintf(sqlStr,"insert into t_user(tel,password,name,icon,feeling) "
//                           "values('%s','%s','%s','%d','%s');",
//                    rq->m_tel,rq->m_password,rq->m_name,1,"nothing");
//            if(!m_sql->UpdataMysql(sqlStr))
//            {
//                cout<<"updataMysql error:"<<sqlStr<<endl;
//                return;
//            }
//        }
//    }
//    m_tcp->SendData(clientfd,(char*)&rs,sizeof(rs));
//}
